/*
 * Prueba.cpp
 *
 *  Created on: 24 Feb 2010
 *      Author: administrador
 */

#include "NodoHoja.h"
#include <iostream>
#include "Elemento.h"
#include <sstream>
#include <string>
#include "stdlib.h"
#include "Excepciones.h"
#include "Archivo.h"
#include "Arbol.h"

using namespace std;

/* ***PRIMITIVAS DE RECUPERACION DE REGISTROS*** */

void buscarRegistro(int clave)
{
	Elemento* elemento;
	Arbol* arbol = Arbol::getInstancia();
	elemento = arbol->buscarElemento(clave);
	cout<<"Elemento con clave: "<<elemento->getClave()<<" y valor: "<<elemento->getValor()<<endl;
}

void listarRegistros()
{
	Arbol* arbol = Arbol::getInstancia();
	arbol->print();
}

void siguienteRegistro()
{
	Elemento* elemento;
	Arbol* arbol = Arbol::getInstancia();
	elemento = arbol->getElementoSiguiente();
	cout<<"Elemento con clave: "<<elemento->getClave()<<" y valor: "<<elemento->getValor()<<endl;
}

void anteriorRegistro()
{
	Elemento* elemento;
	Arbol* arbol = Arbol::getInstancia();
	elemento = arbol->getElementoAnterior();
	cout<<"Elemento con clave: "<<elemento->getClave()<<" y valor: "<<elemento->getValor()<<endl;
}

/* ***PRIMITIVAS DE ACTUALIZACION DE REGISTROS*** */

void insertarRegistro(int clave, char* valor)
{
	string valorStr = valor;
	Elemento* elemento = new Elemento(clave,&valorStr);
	Arbol* arbol = Arbol::getInstancia();
	arbol->insertarElemento(elemento);
	delete elemento;
}

void modificarRegistro(int clave, char* valor)
{
	string valorStr = valor;
	Arbol* arbol = Arbol::getInstancia();
	arbol->modificarElemento(clave, &valorStr);
}

void suprimirValor(int clave)
{
	Arbol* arbol = Arbol::getInstancia();
	arbol->quitarElemento(clave);
}

/* ***LINEA DE COMANDOS*** */

void ayuda(char* programa)
{
	cout<<"***********************************************"<<endl;
	cout<<"Usar: [Opciones]"<<endl;
	cout<<"-i clave valor : Inserta un registro en el árbol"<<endl;
	cout<<"-m clave valor : Modifica un registro en el árbol"<<endl;
	cout<<"-s clave : Suprime un registro en el árbol"<<endl;
	cout<<"-b clave : Busca un registro en el árbol"<<endl;
	cout<<"-l : Lista los registros del árbol"<<endl;
	cout<<"-S : Obtiene el siguiente registro del árbol"<<endl;
	cout<<"-A : Obtiene el anterior registro del árbol"<<endl;
	cout<<"***********************************************"<<endl;
}

/* ***PROGRAMA PRINCIPAL*** */

int main(int argc, char** argv)
{
	int* clave = NULL;
	char* valor = NULL;
	int argBu = 0;
	int argLi = 0;
	int argIn = 0;
	int argMo = 0;
	int argSu = 0;
	int argSi = 0;
	int argAn = 0;

	/* Se le asigna un valor por defecto y el nombre "Prueba" al archivo de almacenamiento */
	Archivo::setBucket(140);
	Archivo::setNombre("Prueba");
	Arbol::setTamanioMaximoNodo(140);

	if(argc == 1)
	{
		ayuda(argv[0]);
		return 0;
	}
	for(int i; i < argc; i++)
	{
		if(argIn == 1)
		{
			if(clave == NULL)
			{
				*clave = atoi(argv[i]);
			}else
			{
				valor = argv[i];
				cout<<"Se INSERTARÁ el registro con clave: "<<*clave<<" y valor: "<<valor<<endl;
				insertarRegistro(*clave,valor);
				argIn = 0;
			}

		}else if(argMo == 1)
		{
			if(clave == NULL)
			{
				*clave = atoi(argv[i]);
			}else
			{
				valor = argv[i];
				cout<<"Se MODIFICARÁ el registro con clave: "<<*clave<<" y valor: "<<valor<<endl;
				modificarRegistro(*clave,valor);
				argMo = 0;
			}

		}else if(argSu == 1)
		{
			*clave = atoi(argv[i]);
			cout<<"Se SUPRIMIRÁ el registro con clave: "<<*clave<<endl;
			suprimirValor(*clave);
			argSu = 0;

		}else if(argBu == 1)
		{
			*clave = atoi(argv[i]);
			cout<<"Se BUSCARÁ el registro con clave: "<<*clave<<endl;
			buscarRegistro(*clave);
			argBu = 0;

		}else if(!strcmp(argv[i],"-l"))
		{
			argLi = 1;
			cout<<"Se LISTARÁN los registros"<<endl;
			listarRegistros();

		}else if(!strcmp(argv[i],"-i"))
		{
			argIn = 1;
			cout<<"Opción -i: Inserta un registro"<<endl;

		}else if(!strcmp(argv[i],"-m"))
		{
			argMo = 1;
			cout<<"Opción -m: Modifica un registro"<<endl;

		}else if(!strcmp(argv[i],"-s"))
		{
			argSu = 1;
			cout<<"Opción -s: Suprime un registro"<<endl;

		}else if(!strcmp(argv[i],"-b"))
		{
			argBu = 1;
			cout<<"Opción -b: Busca un registro"<<endl;

		}else if(!strcmp(argv[i],"-S"))
		{
			argSi = 1;
			cout<<"Opción -S: Se obtiene el registro siguiente"<<endl;
			siguienteRegistro();

		}else if(!strcmp(argv[i],"-A"))
		{
			argAn = 1;
			cout<<"Opción -A: Se obtiene el registro anterior"<<endl;
			anteriorRegistro();
		}

		else
		{
			cout<<"Opción inválida: Se Listan los comandos válidos"<<endl;
			ayuda(argv[0]);
			Arbol::borrarInstancia();
			Archivo::getInstance()->deleteInstance();
			return -1;
		}

	}

	Arbol::borrarInstancia();
	Archivo::getInstance()->deleteInstance();
	return 0;
}

/*




int main(int argc, char **argv) {

	Archivo::setBucket(140);
	Archivo::setNombre("pepecito");
	Arbol::setTamanioMaximoNodo(140);

	int claves[10] = {25,45,200,34,67,10,15,40,150,600};

	char *valor1 = new char[50];
	char *valor2 = new char[40];
	Arbol *arbol = Arbol::getInstancia();
	for (int i=0; i<10; i++){
		sprintf(valor1,"%d",claves[i]);
		sprintf(valor2,"%d",i);
		std::string *valor = new std::string("Clave: ");
		*valor +=valor1;
		*valor +=" Palabra: ";
		*valor += valor2;

	Elemento *elemento = new Elemento(claves[i], valor);
	arbol->insertarElemento(elemento);
	delete elemento;
	}
	delete[] valor1;
	delete[] valor2;
	arbol->print();

	Arbol::borrarInstancia();
	Archivo::getInstance()->deleteInstance();

}

*/
